perm filename MLISP.MLI[MLI,LSP] blob
sn#166081 filedate 1975-06-28 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN
C00026 ENDMK
C⊗;
BEGIN
SPECIAL ?&FILENAME, ?&CURFN, ?&ECNT, ?&RCNT, ?&SPECS, ?&FNS, ?&X?&, ?&Y?&;
SPECIAL SCNVAL, ?&SCANVAL, ?&SCANTYPE, ?&IDTYPE, ?&STRTYPE, ?&NUMTYPE, ?&DELIMTYPE;
SPECIAL BASE, IBASE, BLANK, CR, VT;
DEFINE ?&NEXT PREFIX, ?&NEXTDELIM PREFIX;
FEXPR MLISP (L);
BEGIN
NEW FILE, TIM, EX;
NEW ?&FILENAME, ?&CURFN, ?&ECNT, ?&RCNT, ?&SPECS, ?&FNS,
?&X?&, ?&Y?&, ?&SCANVAL, ?&SCANTYPE;
IF NOT ?&ISDEVICE(CAR L) THEN L ← 'DSK?: CONS L;
IF ATOM (?&FILENAME ← L[2]) THEN FILE ← ?&FILENAME
ELSE FILE ← CAR ?&FILENAME;
INC(EVAL <'INPUT, CAR L, ?&FILENAME>, NIL);
IF L ← CDDR L THEN
IF GET('PPRINTQ, 'FSUBR) THEN
?&Y?& ← EVAL <'OUTPUT, 'DSK?:,
FILE CONS (IF CAR L THEN 'LAP ELSE 'LSP)>
ELSE PRINTSTR "USE MLISPC" ALSO GO EXIT;
CSYM ?&M000;
PRINTSTR TERPRI TERPRI "*****";
TIM ← TIME();
IF (EX ← MTRANS()) AND EX ≠ '(PROG NIL) THEN
?&FNS ← PRINTTY('RESTART) CONS ?&FNS
ALSO PUTPROP('RESTART, <'LAMBDA, NIL, EX>, 'EXPR);
TIM ← (TIME() - TIM) / 1000;
PRINTSTR TERPRI "*****";
CSYM G0000;
IF ?&SCANVAL NEQ '?. THEN ?&ERROR("END OF PROGRAM NOT A PERIOD");
PRINTSTR(TIM CAT " SECONDS TRANSLATION TIME");
PRINTSTR(?&ECNT CAT " ERRORS DETECTED");
PRINTSTR(?&RCNT CAT " FUNCTIONS REDEFINED");
TERPRI INC(NIL, T);
IF NULL L THEN
(IF GET('RESTART, 'EXPR) THEN RESTART()) ALSO GO EXIT;
?&Y?& ← NIL;
MAPCAR(FUNCTION(LAMBDA (?&X?&);
IF NOT(?&X?& ε ?&Y?&) THEN PUTPROP(?&X?&, T, 'SPECIAL)
ALSO ?&Y?& ← ?&X?& CONS ?&Y?&),
?&SPECS);
PRINTSTR "SPECIAL DECLARATIONS:";
TERPRI TERPRI PRINT (?&SPECS ← ?&Y?&);
MAPCAR(FUNCTION(LAMBDA (?&X?&);
IF GET(?&X?&, 'SPECIAL) THEN
?&WARNING("FUNCTION ALSO DECLARED SPECIAL", ?&X?&)),
?&FNS ← REVERSE ?&FNS);
IF CAR L THEN PRINTSTR ("COMPILING ONTO " CAT FILE CAT ".LAP")
ELSE PRINTSTR ("PRINTING ONTO " CAT FILE CAT ".LSP");
TERPRI OUTC(T, TERPRI NIL);
BASE ← 8;
IF CAR L THEN
MAPCAR(FUNCTION(LAMBDA (X);
BEGIN
COMPILEFUN(X);
IF REMPROP(PRINTTY(X), 'EXPR) THEN PUTPROP(X, T, '?*EXPR);
END), ?&FNS)
ELSE BEGIN
L ← NULL CDR(L) OR L[2];
PPRINT('(SPECIAL) CONS ?&SPECS, NIL);
PPRINT('(?*FEXPR ?*LEXPR) CONS ?&FNS, NIL);
PPRINT('(MACRO) CONS ?&FNS, L);
PPRINT('(EXPR FEXPR) CONS ?&FNS, L);
END;
BASE ← 10;
EXIT; OUTC(NIL, T);
INC(NIL, T);
RETURN TERPRI '?*?*?*?-END?-OF?-RUN?-?*?*?*;
END;
EXPR MTRANS ();
BEGIN
NEW EX;
?&SPECS ← ?&FNS ← NIL;
?&ECNT ← ?&RCNT ← 0;
?&CURFN ← 'TOP?-LEVEL;
?&X?& ← T;
SCANSET();
?&SCAN();
EX ← ?&EXPR();
SCANRESET();
RETURN EX;
END;
EXPR MEVAL ();
BEGIN
NEW MODE, ?&X?&;
PRINC TERPRI "WELCOME TO MLISP. TYPE `HELP;' FOR HELP.";
SCANSET();
MODE ← 'M;
WHILE T DO
BEGIN
PRINC TERPRI TERPRI MODE;
?&X?& ← IF MODE EQ 'M THEN MTRANS() ELSE READ();
IF ?&X?& EQ 'LISP THEN SCANRESET() ALSO MODE ← 'L
ELSE IF ?&X?& EQ 'MLISP THEN SCANSET() ALSO MODE ← 'M
ELSE IF ?&X?& EQ 'HELP THEN
BEGIN
EVAL '(INC (INPUT HELP SYS?: (HELP.MLI)) NIL);
PRINTSTR READ();
INC(NIL, T);
END
ELSE IF MODE EQ 'M THEN
SCANRESET() ALSO
ERRSET(PRINT EVAL ?&X?&, T) ALSO
SCANSET()
ELSE ERRSET(PRINT EVAL ?&X?&, T);
END;
END;
EXPR ?&EXPR ();
?&HIER(0, ?&SIMPEX());
EXPR ?&HIER (RBP, EX);
IF ?&SCANTYPE EQ ?&NUMTYPE OR ?&SCANTYPE EQ ?&STRTYPE THEN
?&ERROR("ILLEGAL INFIX OPERATOR")
ELSE IF RBP GREATERP ?&BINDINGPOWER(?&SCANVAL, '?&LEFT) THEN EX
ELSE ?&HIER1(RBP, EX, ?&BINDINGPOWER(?&SCANVAL, '?&RIGHT));
EXPR ?&HIER1 (RBP, EX, RBP1);
?&HIER(RBP, ?&TINFIX(?&ADVANCE(?&SCANVAL),
?&NEXTDELIM '?⊗, EX, ?&HIER(RBP1, ?&SIMPEX())));
EXPR ?&SIMPEX ();
LAMBDA (EX);
IF ?&NEXTDELIM '?[ THEN
<'?&INDEX, EX, 'LIST CONS
?&ARGS('?], "ILLEGAL INDEX EXPRESSION")>
ELSE EX;
(IF ?&ID() THEN
?&TFNCALL(?&ADVANCE(?&SCANVAL))
ELSE IF ?&SCANTYPE EQ ?&NUMTYPE THEN
?&ADVANCE(?&SCANVAL)
ELSE IF GET(?&SCANVAL, '?&RESWORD) THEN
IF ?&NEXT 'BEGIN THEN
'PROG CONS ?&TDECL(NIL) CONS ?&EXPRLIST()
ELSE IF ?&NEXT 'IF THEN
'COND CONS ?&TCOND(?&EXPR())
ELSE IF ?&NEXT 'FOR THEN
?&TFOR()
ELSE IF ?&NEXT 'WHILE THEN
?&TWHILE(?&QEXPR())
ELSE IF ?&NEXT 'DO THEN
?&TDO('(QUOTE PROG2), ?&QEXPR(), 'DO)
ELSE IF ?&NEXT 'COLLECT THEN
?&TDO('(QUOTE APPEND), ?&QEXPR(), 'COLLECT)
ELSE IF ?&NEXT 'LAMBDA THEN
?&TLAMBDA(T)
ELSE IF ?&NEXT 'DEFINE THEN
?&TDEFINE()
ELSE IF ?&NEXT 'COMMENT THEN
?&SEMISKIP() ALSO ?&SCAN() ALSO ?&SIMPEX()
ELSE IF GET(?&SCANVAL, '?&FNTYPE) THEN
?&TFN(?&ADVANCE(?&SCANVAL), ?&ADVANCE(?&SCANVAL))
ELSE IF ?&SCANVAL EQ 'OCTAL THEN
?&OCTALNUM()
ELSE IF ?&SCANVAL EQ 'INLINE THEN
?&INLINECODE()
ELSE ?&ERROR("ILLEGAL RESERVED WORD BEGINNING AN EXPRESSION")
ELSE IF GET(?&SCANVAL, '?&PREFIX) THEN
?&TPREFIX(?&ADVANCE(?&SCANVAL), ?&NEXTDELIM '?⊗)
ELSE IF ?&SCANVAL EQ '?' THEN
?&ADVANCE(<'QUOTE, SREAD()>)
ELSE IF ?&NEXTDELIM '?( THEN
?&TPAREN(?&EXPR())
ELSE IF ?&NEXTDELIM '?< THEN
'LIST CONS ?&ARGS('?>, "ILLEGAL EXPRESSION IN LIST BRACKETS")
ELSE IF ?&SCANTYPE EQ ?&STRTYPE THEN
?&ADVANCE(<'QUOTE, ?&SCANVAL>)
ELSE ?&ERROR("ILLEGAL SYMBOL BEGINNING A SIMPLE EXPRESSION"));
EXPR ?&TPREFIX (FN, VOP);
?&TP1(FN, VOP, ?&HIER(?&BINDINGPOWER(FN, '?&RIGHT), ?&SIMPEX()));
EXPR ?&TP1 (FN, VOP, EX);
IF FN EQ 'PLUS THEN EX
ELSE IF FN EQ 'DIFFERENCE AND (FN ← 'MINUS) AND NUMBERP EX
AND NOT VOP THEN MINUS EX
ELSE IF VOP THEN <'?&VECTOR, T, <'QUOTE, FN>, EX, NIL>
ELSE <FN, EX>;
EXPR ?&TINFIX (FN, VOP, X, Y);
IF FN EQ '?← THEN
IF VOP THEN <'?&DECOMPOSE, X, Y>
ELSE IF ATOM X THEN <'SETQ, X, Y>
ELSE IF CAR X EQ '?&INDEX THEN ?&TREPLACE(X[2], X[3], Y, GENSYM())
ELSE IF ATOM CAR X THEN <'STORE, X, Y>
ELSE ?&ERROR("ILLEGAL ASSIGNMENT TO " CAT X)
ELSE IF VOP THEN <'?&VECTOR, NIL, <'QUOTE, FN>, X, Y>
ELSE IF Y EQ 1 AND FN EQ 'PLUS THEN <'ADD1, X>
ELSE IF Y EQ 1 AND FN EQ 'DIFFERENCE THEN <'SUB1, X>
ELSE IF GET(FN, '?&ASSOC) AND NOT ATOM(X) AND FN EQ CAR(X) THEN X @ <Y>
ELSE <FN, X, Y>;
EXPR ?&TDECL (L);
IF ?&NEXT 'NEW THEN ?&TDECL(L @ ?&VARS('?;, NIL, NIL))
ELSE IF ?&NEXT 'SPECIAL THEN ?&TDECL(PROG2(?&VARS('?;, T, NIL), L))
ELSE L;
EXPR ?&EXPRLIST ();
BEGIN
NEW EX, L, X;
LOOP; IF EX ← ?&EXPR() THEN L ← EX CONS L;
X ← ?&NEXTDELIM '?; ;
IF ?&NEXT 'END THEN RETURN REVERSE L
ELSE IF X THEN GO LOOP
ELSE ?&ERROR("MISSING SEMICOLON AFTER EXPRESSION");
END;
EXPR ?&TCOND (EX);
IF ?&NEXT 'THEN THEN ?&TC1(EX CONS ?&TALSO(?&EXPR()))
ELSE ?&ERROR("ILLEGAL EXPRESSION AFTER IF");
EXPR ?&TC1 (L);
IF ?&NEXT 'ELSE THEN
IF ?&NEXT 'IF THEN L CONS ?&TCOND(?&EXPR())
ELSE <L, T CONS ?&TALSO(?&EXPR())>
ELSE <L>;
EXPR ?&TALSO (EX);
IF ?&NEXT 'ALSO THEN EX CONS ?&TALSO(?&EXPR())
ELSE <EX>;
EXPR ?&TFOR ();
<'?&FOR, <'QUOTE, ?&FORCLAUSE()>,
<'QUOTE, IF ?&NEXT 'DO THEN 'PROG2
ELSE IF ?&NEXT 'COLLECT THEN 'APPEND
ELSE IF ?&NEXTDELIM '?; THEN ?&ADVANCE(?&SCANVAL)
ELSE ?&ERROR("EXPECTED DO, COLLECT OR ; IN FOR-LOOP")>,
?&QEXPR(),
IF ?&NEXT 'UNTIL THEN ?&QEXPR() ELSE '(QUOTE NIL)>;
EXPR ?&FORCLAUSE ();
((IF ?&NEXT 'NEW THEN 'NEW ELSE 'OLD)
CONS ( IF ?&ID() THEN ?&ADVANCE(?&SCANVAL)
ELSE ?&ERROR("NON-IDENTIFIER OR PREFIX AFTER FOR"))
CONS ( IF ?&NEXT 'IN THEN <'IN, ?&EXPR()>
ELSE IF ?&NEXT 'ON THEN <'ON, ?&EXPR()>
ELSE IF ?&NEXTDELIM '?← THEN <'?←, <'?&RANGE, ?&EXPR(),
IF ?&NEXT 'TO THEN ?&EXPR()
ELSE ?&ERROR("ILLEGAL LOWER LIMIT IN FOR-LOOP"),
IF ?&NEXT 'BY THEN ?&EXPR()
ELSE 1>>
ELSE ?&ERROR("MISSING IN, ON, OR ← AFTER CONTROL VARIABLE IN FOR-LOOP")))
CONS ( IF ?&NEXT 'FOR THEN ?&FORCLAUSE()
ELSE NIL);
EXPR ?&TDO (FN, EX, X);
IF ?&NEXT 'UNTIL THEN <'?&DO, FN, EX, ?&QEXPR()>
ELSE ?&ERROR("EXPECTED UNTIL IN " CAT X CAT "-UNTIL EXPRESSION");
EXPR ?&TWHILE (EX);
IF ?&NEXT 'DO THEN <'?&WHILE, '(QUOTE PROG2), EX, ?&QEXPR()>
ELSE IF ?&NEXT 'COLLECT THEN <'?&WHILE, '(QUOTE APPEND), EX, ?&QEXPR()>
ELSE ?&ERROR("EXPECTED DO OR COLLECT IN WHILE EXPRESSION");
EXPR ?&TDEFINE ();
DO BEGIN
NEW VAL, TYP;
IF (TYP ← ?&SCANTYPE) NEQ ?&IDTYPE
AND ?&SCANTYPE NEQ ?&DELIMTYPE THEN
?&ERROR("ILLEGAL SYMBOL BEING DEFINED");
VAL ← ?&ADVANCE(?&SCANVAL);
IF ?&NEXT 'PREFIX THEN ?&MAKPREFIX(VAL);
IF (?&SCANTYPE EQ ?&IDTYPE AND ?&SCANVAL NEQ 'DIFFERENCE)
OR (?&SCANTYPE EQ ?&DELIMTYPE AND NOT(?&SCANVAL ε '(?, ?;)))
THEN PUTPROP(?&SCANVAL, TYP, '?&TRANSTYPE)
ALSO PUTPROP(?&ADVANCE(?&SCANVAL), VAL, '?&TRANS);
IF ?&NUMB(VAL, '?&LEFT) THEN
?&NUMB(VAL, '?&RIGHT)
OR ?&ERROR("MISSING RIGHT BINDING POWER");
END
UNTIL NOT ?&NEXTDELIM '?, ;
EXPR ?&NUMB (VAL, IND);
IF ?&SCANTYPE EQ ?&NUMTYPE THEN
?&ADVANCE(PUTPROP(VAL, ?&SCANVAL, IND))
ELSE IF ?&NEXT 'DIFFERENCE THEN
IF ?&SCANTYPE EQ ?&NUMTYPE THEN
?&ADVANCE(PUTPROP(VAL, MINUS ?&SCANVAL, IND))
ELSE ?&ERROR("ILLEGAL BINDING POWER");
EXPR ?&TFN (IND, ?&CURFN);
BEGIN
NEW L;
?&FNCHECK(?&CURFN);
PUTPROP(?&CURFN, L ← ?&TLAMBDA(NIL), IND);
IF IND EQ 'EXPR THEN LENGTH L[2] EQ 1 AND ?&MAKPREFIX(?&CURFN)
ELSE IF IND EQ 'FEXPR THEN PUTPROP(?&CURFN, T, '?*FEXPR)
ELSE IF IND EQ 'LEXPR THEN
IF LENGTH L[2] EQ 1 THEN
PUTPROP(?&CURFN, <'LAMBDA, L[2,1], L[3]>, 'EXPR)
ALSO PUTPROP(?&CURFN, T, '?*LEXPR)
ELSE ?&ERROR("LEXPRS MUST HAVE EXACTLY ONE ARGUMENT, NOT " CAT L[2])
ELSE NIL;
?&FNS ← ?&CURFN CONS ?&FNS;
END;
EXPR ?&FNCHECK (X);
IF GETL(X, '(EXPR FEXPR SUBR FSUBR MACRO)) THEN ?&RCNT ← ?&RCNT+1
ALSO ?&WARNING("FUNCTION REDEFINED", X)
ELSE PRINTTY(X);
EXPR ?&MAKPREFIX (FN);
BEGIN
GET(FN, '?&RIGHT) OR PUTPROP(FN, 1000, '?&RIGHT);
GET(FN, '?&LEFT) OR PUTPROP(FN, -1, '?&LEFT);
PUTPROP(FN, T, '?&PREFIX);
END;
EXPR ?&TLAMBDA (ALLOW);
IF ?&NEXTDELIM '?( THEN ?&TL1(?&VARS('?), ?&NEXT 'SPECIAL, T), ALLOW)
ELSE ?&ERROR("'(' NEEDED FOR LAMBDA VARIABLES");
EXPR ?&TL1 (L, ALLOW);
IF ?&NEXTDELIM '?; THEN ?&TL2(<'LAMBDA, L, ?&EXPR()>, ALLOW)
ELSE ?&ERROR("';' NEEDED AFTER LAMBDA VARIABLES");
EXPR ?&TL2 (EX, ALLOW);
IF ALLOW AND ?&NEXTDELIM '?; THEN
IF ?&NEXTDELIM '?( THEN
EX CONS ?&ARGS('?), "ILLEGAL LAMBDA ARGUMENT")
ELSE ?&ERROR("'(' NEEDED FOR LAMBDA ARGUMENTS")
ELSE EX;
EXPR ?&VARS (TERMIN, ISSPEC, ALLOW);
IF ?&NEXTDELIM TERMIN THEN NIL
ELSE ?&TID(ISSPEC) CONS ?&VAR1(TERMIN, ISSPEC, ALLOW);
EXPR ?&VAR1 (TERMIN, ISSPEC, ALLOW);
IF ?&NEXTDELIM '?, THEN
?&TID(ALLOW AND ?&NEXT 'SPECIAL OR NOT ALLOW AND ISSPEC)
CONS ?&VAR1(TERMIN, ISSPEC, ALLOW)
ELSE IF ?&NEXTDELIM TERMIN THEN NIL
ELSE ?&ERROR("ILLEGAL PROG OR LAMBDA VARIABLE");
EXPR ?&ARGS (TERMIN, MSG);
IF ?&NEXTDELIM TERMIN THEN NIL
ELSE ?&EXPR() CONS ?&ARG1(TERMIN, MSG);
EXPR ?&ARG1 (TERMIN, MSG);
IF ?&NEXTDELIM '?, THEN ?&EXPR() CONS ?&ARG1(TERMIN, MSG)
ELSE IF ?&NEXTDELIM TERMIN THEN NIL
ELSE ?&ERROR(MSG);
EXPR ?&TID (ISSPEC);
IF ?&ID() THEN ISSPEC AND ?&SPECS ← ?&SCANVAL CONS ?&SPECS
ALSO ?&ADVANCE(?&SCANVAL)
ELSE ?&ERROR("NON-IDENTIFIER OR PREFIX USED IN FORMAL VARIABLE LIST");
EXPR ?&TFNCALL (X);
IF ?&NEXTDELIM '?( THEN X CONS ?&ARGS('?), "ILLEGAL ARGUMENT")
ELSE X;
EXPR ?&TREPLACE (X, L, Y, G);
<'PROG2, <'SETQ, X, <'?&REPLACE, X, L, <'SETQ, G, Y>>>, G>;
EXPR ?&TPAREN (EX);
IF ?&NEXTDELIM '?) THEN EX
ELSE ?&ERROR("ILLEGAL PARENTHESIZED EXPRESSION");
EXPR ?&OCTALNUM ();
BEGIN
NEW IBASE;
IBASE ← 8;
?&SCAN();
IF ?&SCANTYPE EQ ?&NUMTYPE THEN RETURN ?&ADVANCE(?&SCANVAL)
ELSE ?&ERROR("RESERVED WORD OCTAL NOT FOLLOWED BY A NUMBER");
END;
EXPR ?&INLINECODE ();
BEGIN
NEW BASE, IBASE;
BASE ← IBASE ← 8;
IF ATOM(?&SCANVAL ← SREAD()) OR CAR(?&SCANVAL) NEQ 'LAP THEN
?&ERROR("INLINE CODE DOES NOT BEGIN WITH: (LAP <NAME> <IND>)");
?&FNCHECK(?&SCANVAL[2]);
IF ?&Y?& THEN
BEGIN
OUTC(T, NIL);
PRINT ?&SCANVAL;
L; IF PRINT READ() THEN GO L
ELSE OUTC(TERPRI NIL, NIL);
END
ELSE EVAL ('?&LAP CONS CDR ?&SCANVAL);
?&SCAN();
END;
EXPR ?&ERROR (MSG);
BEGIN
NEW PAGE, LINE, IFILE, OFILE, X;
?&ECNT ← ?&ECNT+1;
PAGE ← CAR PGLINE();
LINE ← CDR PGLINE();
OFILE ← OUTC(NIL, NIL);
TERPRI NIL;
PRINTSTR ("*** ERROR IN " CAT ?&CURFN);
PRINTSTR ("*** " CAT MSG);
PRINTSTR ("*** CURRENT SYMBOL IS " CAT ?&SCANVAL);
IF NULL (IFILE ← INC(NIL, NIL)) THEN GO MORE;
PRINTSTR ("*** LINE NUMBER " CAT LINE CAT '?/ CAT PAGE);
PRINTSTR "*** TYPE E TO EDIT YOUR FILE, C TO CONTINUE";
LOOP; IF (X ← SREAD()) EQ 'E THEN READCH() EQ CR AND READCH()
ALSO PRINTSTR VT
ALSO SWAP(?&FILENAME, PAGE, LINE)
ELSE IF X EQ 'C THEN GO MORE
ELSE PRINTSTR ("TYPE E OR C, NOT " CAT X)
ALSO GO LOOP;
MORE; PRINTSTR "*** SKIPPING TO NEXT SEMICOLON";
INC(IFILE, NIL);
OUTC(OFILE, NIL);
?&SEMISKIP();
END;
EXPR ?&WARNING (MSG, X);
BEGIN
NEW OFILE;
OFILE ← OUTC(NIL, NIL);
PRINC TERPRI "*** WARNING ***, ";
PRINC MSG;
PRINC ": ";
PRINTSTR X;
OUTC(OFILE, NIL);
RETURN X;
END;
EXPR ?&SEMISKIP ();
WHILE NOT(?&SCANVAL EQ '?; AND ?&SCANTYPE EQ ?&DELIMTYPE) DO ?&SCAN();
EXPR ?&SCAN ();
IF (?&SCANTYPE ← SCAN()) EQ ?&IDTYPE THEN ?&SCAN1(INTERN SCNVAL)
ELSE IF ?&SCANTYPE EQ ?&DELIMTYPE THEN ?&SCAN1(INTERN ASCII SCNVAL)
ELSE ?&SCANVAL ← SCNVAL;
EXPR ?&SCAN1 (X);
IF GET(X, '?&TRANS) AND ?&X?& THEN
?&SCANTYPE ← GET(X, '?&TRANSTYPE) ALSO
?&SCANVAL ← GET(X, '?&TRANS)
ELSE ?&SCANVAL ← X;
EXPR ?&NEXT (X);
IF ?&SCANVAL EQ X THEN ?&ADVANCE(T);
EXPR ?&NEXTDELIM (X);
IF ?&SCANVAL EQ X AND ?&SCANTYPE EQ ?&DELIMTYPE THEN ?&ADVANCE(T);
EXPR ?&ADVANCE (X);
PROG2(?&SCAN(), X);
EXPR ?&ID ();
?&SCANTYPE EQ ?&IDTYPE
AND NOT(GET(?&SCANVAL, '?&RESWORD) OR GET(?&SCANVAL, '?&PREFIX));
EXPR ?&BINDINGPOWER (X, IND);
IF X ← GET(X, IND) THEN X ELSE GET('?&DEFAULT, IND);
EXPR ?&QEXPR ();
<'QUOTE, ?&EXPR()>;
EXPR ?&ISDEVICE (X);
(ATOM X AND CAR LAST(EXPLODEC X) EQ '?:)
OR (NOT ATOM X AND NOT ATOM CDR X);
FEXPR ?&LAP (X);
BEGIN
NEW LOC, CONLIST, GEN, REMOB;
SPECIAL LOC, CONLIST, GEN, REMOB, KLIST, BPORG, LAPORG;
GEN ← GENSYM();
CONLIST ← <NIL>;
LOC ← BPORG;
LOOP; IF NULL (?&SCANVAL ← SREAD()) THEN GO EXIT
ELSE IF ATOM ?&SCANVAL THEN GO A
ELSE GO I;
A; DEFSYM(?&SCANVAL, LOC);
GO LOOP;
I; DEPOSIT(LOC, GWD(?&SCANVAL));
?&BPCHECK();
GO LOOP;
EXIT; DEFSYM(GEN, LOC);
MAPCAR(FUNCTION(LAMBDA (Y);
BEGIN
KLIST ← (Y CONS LOC) CONS KLIST;
DEPOSIT(LOC, GWD(Y));
?&BPCHECK();
END),
CDR CONLIST);
PUTPROP(CAR X, NUMVAL BPORG, X[2]);
BPORG ← LOC;
MAPCAR(FUNCTION(LAMBDA (Y);
IF REMPROP(Y, 'SYM) AND GET(Y, 'UNDEF) THEN
?&ERROR("UNDEFINED LABEL USED IN INLINE CODE: " CAT Y)),
REMOB);
END;
EXPR ?&BPCHECK ();
IF (LOC ← LOC+1) ≥ LAPORG THEN ?&ERROR("BINARY PROGRAM SPACE EXCEEDED");
END.